package au.com.acpfg.xml.writer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import org.knime.core.data.DataCell;
import org.knime.core.data.DataColumnSpec;
import org.knime.core.data.DataColumnSpecCreator;
import org.knime.core.data.DataRow;
import org.knime.core.data.DataTableSpec;
import org.knime.core.data.RowIterator;
import org.knime.core.data.RowKey;
import org.knime.core.data.def.DefaultRow;
import org.knime.core.data.def.DoubleCell;
import org.knime.core.data.def.IntCell;
import org.knime.core.data.def.StringCell;
import org.knime.core.node.BufferedDataContainer;
import org.knime.core.node.BufferedDataTable;
import org.knime.core.node.CanceledExecutionException;
import org.knime.core.node.defaultnodesettings.SettingsModelBoolean;
import org.knime.core.node.defaultnodesettings.SettingsModelColumnName;
import org.knime.core.node.defaultnodesettings.SettingsModelIntegerBounded;
import org.knime.core.node.defaultnodesettings.SettingsModelString;
import org.knime.core.node.ExecutionContext;
import org.knime.core.node.ExecutionMonitor;
import org.knime.core.node.InvalidSettingsException;
import org.knime.core.node.NodeLogger;
import org.knime.core.node.NodeModel;
import org.knime.core.node.NodeSettingsRO;
import org.knime.core.node.NodeSettingsWO;
import au.com.acpfg.xml.reader.XMLCell;
/**
* This is the model implementation of XMLWriter.
* Saves XMLcell's to disk as separate XML documents.
*
* @author Andrew Cassin
*/
public class XMLWriterNodeModel extends NodeModel {
// the logger instance
private static final NodeLogger logger = NodeLogger
.getLogger(XMLWriterNodeModel.class);
public static final String CFGKEY_FOLDER = "xml-folder";
public static final String CFGKEY_EXTN = "xml-extension";
public static final String CFGKEY_BASENAME ="xml-column-for-basename";
public static final String CFGKEY_USE_ROWID = "basename-use-rowid?";
public static final String CFGKEY_XML_COL = "xml-column";
private final SettingsModelString m_folder = new SettingsModelString(CFGKEY_FOLDER, "c:/temp");
private final SettingsModelString m_extn = new SettingsModelString(CFGKEY_EXTN, ".xml");
private final SettingsModelString m_basename = new SettingsModelString(CFGKEY_BASENAME, "");
private final SettingsModelBoolean m_use_rowid = new SettingsModelBoolean(CFGKEY_USE_ROWID, true);
private final SettingsModelString m_xml_col = new SettingsModelString(CFGKEY_XML_COL, "");
/**
* Constructor for the node model.
*/
protected XMLWriterNodeModel() {
super(1,0);
m_basename.setEnabled(!m_use_rowid.getBooleanValue()); // must be !m_use_basename.getBooleanValue();
}
/**
* {@inheritDoc}
*/
@Override
protected BufferedDataTable[] execute(final BufferedDataTable[] inData,
final ExecutionContext exec) throws Exception {
double done = 0.0;
int n_rows = inData[0].getRowCount();
RowIterator it = inData[0].iterator();
int xml_col_idx = inData[0].getDataTableSpec().findColumnIndex(m_xml_col.getStringValue());
while (it.hasNext()) {
DataRow row = it.next();
DataCell xml_cell = row.getCell(xml_col_idx);
if (xml_cell == null || xml_cell.isMissing()) {
continue;
}
XMLCell xc = (XMLCell) xml_cell;
// compute the output filename
String extn = m_extn.getStringValue().trim();
if (extn.length() < 1) {
extn = ".xml";
} else if (!extn.startsWith(".")) {
extn = "." + extn;
}
String basename = m_use_rowid.getBooleanValue() ? row.getKey().getString() : m_basename.getStringValue();
if (basename.trim().length() < 1) {
basename = "xml-document";
}
String dir = m_folder.getStringValue();
if (dir.length() < 1) {
throw new InvalidSettingsException("Illegal folder to save to... must specify a valid folder. Re-configure the node.");
}
File output_file = new File(dir, basename + (int)done + extn);
FileReader fin = null;
FileOutputStream fos = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
fos = new FileOutputStream(output_file);
fin = new FileReader(xc.asFile());
br = new BufferedReader(fin);
pw = new PrintWriter(fos);
String line;
while ((line = br.readLine()) != null) {
pw.println(line);
}
pw.close();
fin.close();
} catch (Exception e) {
if (br != null)
br.close();
if (pw != null)
pw.close();
throw e;
}
exec.checkCanceled();
exec.setProgress(++done / n_rows);
}
return new BufferedDataTable[]{};
}
/**
* {@inheritDoc}
*/
@Override
protected void reset() {
}
/**
* {@inheritDoc}
*/
@Override
protected DataTableSpec[] configure(final DataTableSpec[] inSpecs)
throws InvalidSettingsException {
return new DataTableSpec[]{};
}
/**
* {@inheritDoc}
*/
@Override
protected void saveSettingsTo(final NodeSettingsWO settings) {
m_folder.saveSettingsTo(settings);
m_extn.saveSettingsTo(settings);
m_basename.saveSettingsTo(settings);
m_use_rowid.saveSettingsTo(settings);
m_xml_col.saveSettingsTo(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadValidatedSettingsFrom(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_folder.loadSettingsFrom(settings);
m_extn.loadSettingsFrom(settings);
m_basename.loadSettingsFrom(settings);
m_use_rowid.loadSettingsFrom(settings);
m_xml_col.loadSettingsFrom(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void validateSettings(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_folder.validateSettings(settings);
m_extn.validateSettings(settings);
m_basename.validateSettings(settings);
m_use_rowid.validateSettings(settings);
m_xml_col.validateSettings(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
}
/**
* {@inheritDoc}
*/
@Override
protected void saveInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
}
}